home *** CD-ROM | disk | FTP | other *** search
- ; Echo (with multiple reflections)
- ;
- ; parameter:
- ; in braces: X/Y for X/Y Memory
- ; 6/8 for Bitwidth of the address
- ;
- ; QUELLE: input value (X-6)
- ; ZIEL: output value (X-6)
- ;
- ; ESIZE: size of buffer - 1 max. 16 Bit
- ; EZAHL: number of reflections max. 12 Bit
- ; DELTAB: reflektor table (Y-8)
- ; EPTR: pointer to buffer input (Y-6)
- ; FBACK: feedback (Y-6)
- ;
- ; reflektor table (24 Bit DSP-Words):
- ; time (buffersize - delay)
- ; volume (0 bis 2^23-1, Maximum: amplification factor 1)
- ; ...
- ; ...
- ;
- ; registers M1,M5 contain $FFFF
- ;
- ; changed registers:
- ; X0,X1,Y0,Y1
- ; B
- ; R1,R5
- ; N1
-
- echo
- ; init registers:
- ;
- clr B #<DELTAB,R5 ; clear sum,
- ; pointer to reflector table
- move #>ESIZE,M1 ; buffersize
- move Y:(R5)+,N1 ; 1. Delay-value from table
- move Y:<EPTR,R1 ; pointer: next buffervalue
-
- ; loop: sum up reflektors
- do #EZAHL,eloop ; number of reflectors
- move Y:(R5)+,X0 ; weight of reflectors
- move X:(R1+N1),X1 ; next value from buffer
- mac X0,X1,B Y:(R5)+,N1 ; sum up, and load next delay
-
- eloop
-
- ; do feedback
- move X:<QUELLE,X1 ; input
- move Y:<FBACK,Y1 ; feedback
- move B,Y0 ; sum of reflections
-
- mpy Y0,Y1,B B,X:<ZIEL ; weight sum,
- ; parallel: Summe to output
- add X1,B ; input value plus feedback
- move B,X:(R1)+ ; store in buffer
- move R1,Y:<EPTR ; save bufferpointer
-
- move #$ffff,M1 ; set M1 back
-
- rts
-
- end
-